#ifndef _ML307_API_H_
#define _ML307_API_H_

#include "ml307_board.h"

#if (_NETWOK_MODLE_TYPE_ == _ML307R_MODLE_) && (_NETWOK_FUNCTION_ENABLE_)

/**
 * @brief 报文解析结果
 *
 */
typedef enum
{
  ML307_PARSING_ERROR,            // 报文解析错误
  ML307_PARSING_SUCCESS,          // 报文解析成功
  ML307_PARSING_NO_KEYWORD_FOUND, // 没有找到关键字
} Ml307MessageParsingResult_t;

/**
 * @brief 应答报文类型
 *
 */
typedef enum
{
  ML307_RESPOND_AT,         // AT命令应答
  ML307_RESPOND_HOST,       // 主机推送
  ML307_RESPOND_ERROR,      // 错误提示
  ML307_RESPOND_DEV_STATE,  // 设备状态
  ML307_RESPOND_DISCONNECT, // 与服务器断开连接
} Ml307MessageType_t;

/**
 * @brief TCP 网络连接状态
 *
 */
typedef enum
{
  ML307_TCP_CONNECT_SUCCESS,    // 连接成功
  ML307_TCP_TRING_TO_RECONNECT, // 正在重连
  ML307_TCP_CONNECT_FAILED,     // 连接失败
} Ml307TcpConnectStatus_t;

/**
 * @brief MQTT 网络连接状态
 *
 */
typedef enum
{
  ML307_MQTT_CONNECT_SUCCESS,    // 连接成功
  ML307_MQTT_TRING_TO_RECONNECT, // 正在重连
  ML307_MQTT_CLIENT_DISCONNECT,  // 客户端断开
  ML307_MQTT_SERVER_REFUSAL,     // 服务器拒绝
  ML307_MQTT_SERVER_DISCONNECT,  // 服务器断开
  ML307_MQTT_CONNECT_FAILED,     // 连接失败
} Ml307MqttConnectStatus_t;

/**
 * @brief URC 消息类型
 *
 */
typedef enum
{
  MQTT_URC_NO_FIND,  // 未找到
  MQTT_URC_COMMECT,  // 连接状态URC
  MQTT_URC_PUBNMI,   // 接收提示URC
  MQTT_URC_DROP,     // 丢弃提示URC
  MQTT_URC_PUBLISH,  // 接收消息URC
  MQTT_URC_PINGRESP, // Ping结果URC
  MQTT_URC_TIMEOUT,  // 超时URC
  MQTT_URC_SUBACK,   // 订阅URC
  MQTT_URC_UNSUBACK, // 取消订阅URC
  MQTT_URC_PUBACK,   // QoS=1时发送结果URC
  MQTT_URC_PUBREC,   // QoS=2时消息到达URC
  MQTT_URC_PUBCOMP,  // QoS=2时消息发送完成URC
} Ml307UrcType_t;

/**
 * @brief 网络连接状态
 *
 */
typedef struct
{
  uint8_t Id;     // 消息ID
  uint8_t Status; // 连接状态
} Ml307ConnectFormat_t;

/**
 * @brief MQTT 主题推送字段格式
 *
 */
typedef struct
{
  uint8_t Mid;
  uint8_t ConnectId;
  uint16_t PayloadSize;
  uint8_t NumberOfTopic;
  char Topic[ML307_MQTT_TOPIC_LENGTH];
} MqttPublishFormat_t;

/**
 * @brief 构建测试命令报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildCommectTestMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建关闭命令回显报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool ML307BuildCloseCommandReturnMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询固件版本号报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildGetFirmwareVersionMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询模块厂商信息报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildQueryModuleManufacturerInformationMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询国际移动用户识别码报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildGetIMSIMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询国际移动设备识别码报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildGetIMEIMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询检查 SIM 卡插入状态报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool ML307BuildCheckIfTheSimCardIsRecognizedMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建获取卡片 ICCID 报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildGetIccidMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询信号强度报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildCheckSignalStrengthMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询网络是否注册报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildCheckIfTheNetworkIsRegisteredMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询是否附着网络报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildCheckIfTheNtworkIsAttachedMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建获取网络运营商报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildGetNetworkOperatorMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建设置网络运营商报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param Operator - 网络运营商
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildSelectNetworkOperatorMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Operator);

/**
 * @brief 构建设置域名解析服务器报文
 *
 * @param pDataOut   - 指向待发送数据地址的指针变量
 * @param pSizeOut   - 发送数据有效长度
 * @param pPreferred - 首选 DNS 服务器
 * @param pAlternate - 备用 DNS 服务器
 * @return bool      - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildDnsConfigurationMessage(void *pDataOut, uint16_t *pSizeOut, const uint8_t *pPreferred, const uint8_t *pAlternate);

/**
 * @brief 构建启动 DNS 域名解析报文
 *
 * @param pDataOut      - 指向待发送数据地址的指针变量
 * @param pSizeOut      - 发送数据有效长度
 * @param pDomainNameIn - 域名
 * @return bool         - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildStartDnsDomainNameResolutionMessage(void *pDataOut, uint16_t *pSizeOut, const char *pDomainNameIn);

/**
 * @brief 构建打开 TCP 服务报文
 *
 * @param pDataOut   - 指向待发送数据地址的指针变量
 * @param pSizeOut   - 发送数据有效长度
 * @param pIpAddress - 目标服务器 IP 地址
 * @param Port       - 目标连接端口
 * @return bool      - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildTcpOpenMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t *pIpAddress, uint16_t Port);

/**
 * @brief 构建获取 TCP 连接状态报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildTcpGetConnectStatusMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建切换 TCP 透传模式报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildTcpSwitchToTransparentModeMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建退出 TCP 透传模式报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildTcpExitTransparentModeMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建关闭 TCP 服务报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildTcpCloseMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建关闭 MQTT 服务报文
 *
 * @param pDataOut - 指向待发送数据地址的指针变量
 * @param pSizeOut - 发送数据有效长度
 * @param Handle   - 订阅服务
 * @return bool    - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildMqttDiscMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Handle);

/**
 * @brief 构建连接 MQTT 服务报文
 *
 * @param pDataOut      - 指向待发送数据地址的指针变量
 * @param pSizeOut      - 发送数据有效长度
 * @param Handle        - 连接句柄
 * @param pDomainNameIn - 域名
 * @param Port          - 端口
 * @param pUserNameIn   - 用户名
 * @param pPasswordIn   - 登录密码
 * @return bool         - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildMqttConnectMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Handle, const char *pDomainNameIn, uint16_t Port, const char *pUserNameIn, const char *pPasswordIn);

/**
 * @brief 构建订阅 MQTT 主题报文
 *
 * @param pDataOut    - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 发送数据有效长度
 * @param Handle      - 连接句柄
 * @param pToTopicsIn - 订阅主题
 * @return bool       - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildMqttSubscribeToTopicsMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Handle, const char *pToTopicsIn);

/**
 * @brief 构建向目标发布消息报文
 *
 * @param pDataOut    - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 发送数据有效长度
 * @param Handle      - 连接句柄
 * @param pToTopicsIn - 发布主题
 * @param DataSize    - 发布消息长度
 * @return bool       - 构建状态（true：成功 false：失败）
 */
extern bool Ml307BuildMqttPublishMessage(void *pDataOut, uint16_t *pSizeOut, uint8_t Handle, const char *pToTopicsIn, uint16_t DataSize);

/**
 * @brief 解析连接测试报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingConnectTestMessage(const void *pDataIn);

/**
 * @brief 解析关闭命令回显报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingCloseCommandReturnMessage(const void *pDataIn);

/**
 * @brief 解析获取固件版本号报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pVersionOut                  - 固件版本号
 * @param MaxNumberOfVersion           - 最大版本号长度
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingGetFirmwareVersionMessage(const void *pDataIn, void *pVersionOut, uint8_t MaxNumberOfVersion);

/**
 * @brief 解析查询厂商信息报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pInformationOut              - 厂商信息
 * @param MaxNumberOfInformation       - 最大接收长度
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingQueryModuleManufacturerInformationMessage(const void *pDataIn, void *pInformationOut, uint8_t MaxNumberOfInformation);

/**
 * @brief 解析获取查询国际移动设备识别码报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pInformationOut              - 国际移动设备识别码
 * @param MaxNumberOfInformation       - 最大接收长度
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingGetIMEIMessage(const void *pDataIn, void *pInformationOut, uint8_t MaxNumberOfInformation);

/**
 * @brief 解析 SIM 卡插入状态
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingCheckIfTheSimCardIsRecognizedMessage(const void *pDataIn);

/**
 * @brief 解析获取国际移动用户识别码报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pInformationOut              - 国际移动用户识别码
 * @param MaxNumberOfInformation       - 最大接收长度
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingGetIMSIMessage(const void *pDataIn, void *pInformationOut, uint8_t MaxNumberOfInformation);

/**
 * @brief 解析获取卡片唯一编码报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pIccidOut                    - 卡片唯一编码
 * @param MaxNumberOfCardNumber        - 最大接收卡号长度
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingGetIccidMessage(const void *pDataIn, void *pIccidOut, uint8_t MaxNumberOfCardNumber);

/**
 * @brief 解析查询信号强度报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pRssiOut                     - 信号强度
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingCheckSignalStrengthMessage(const void *pDataIn, uint8_t *pRssiOut);
/**
 * @brief 解析网络是否注册报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingCheckIfTheNetworkIsRegisteredMessage(const void *pDataIn);

/**
 * @brief 解析查询是否附着网络报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingCheckIfTheNtworkIsAttachedMessage(const void *pDataIn);

/**
 * @brief 解析获取网络运营商报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pInformationOut              - 运营商信息
 * @param MaxNumberOfInformation       - 最大接收长度
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingGetNetworkOperatorMessage(const void *pDataIn, void *pInformationOut, uint8_t MaxNumberOfInformation);

/**
 * @brief 解析设置网络运营商报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingSetNetworkOperatorMessage(const void *pDataIn);

/**
 * @brief 解析配置 DNS 服务器报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingDnsConfigurationMessage(const void *pDataIn);

/**
 * @brief 解析启动 DNS 域名解析报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pHostIpAddressOut            - 域名解析结果
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingStartDnsDomainNameResolutionMessage(const void *pDataIn, uint8_t *pHostIpAddressOut);

/**
 * @brief 解析打开 TCP 服务
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingTcpOpenMessage(const void *pDataIn);

/**
 * @brief 解析获取 TCP 连接状态报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingGetTcpConnectStatusMessage(const void *pDataIn);

/**
 * @brief 解析切换 TCP 透传模式报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingTcpSwitchToTransparentModeMessage(const void *pDataIn);

/**
 * @brief 解析关闭 TCP 服务报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingTcpCloseMessage(const void *pDataIn);

/**
 * @brief 解析关闭 MQTT 服务
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingMqttDiscMessage(const void *pDataIn);

/**
 * @brief 解析连接 MQTT 服务报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingMqttConnectMessage(const void *pDataIn);

/**
 * @brief 解析订阅 MQTT 主题报文
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingMqttSubscribeToTopicsMessage(const void *pDataIn);

/**
 * @brief 判断是否为 TCP URC 事件
 *
 * @param pDataIn                      - 待验证的数据
 * @return Ml307MessageParsingResult_t - 判断状态（true：成功 false：失败）
 */
extern Ml307MessageParsingResult_t Ml307DetermineIfItIsTcpUrcEvent(const void *pDataIn);

/**
 * @brief 判断是否为 MQTT URC 事件
 *
 * @param pDataIn                      - 待验证的数据
 * @return Ml307MessageParsingResult_t - 判断状态（true：成功 false：失败）
 */
extern Ml307MessageParsingResult_t Ml307DetermineIfItIsMqttUrcEvent(const void *pDataIn);

/**
 * @brief 判断报文是否为服务器推送数据
 *
 * @param pDataIn                      - 待验证的数据
 * @return Ml307MessageParsingResult_t - 判断状态（true：成功 false：失败）
 */
extern Ml307MessageParsingResult_t Ml307DetermineIfTheMessageIsServerPushData(const void *pDataIn);

/**
 * @brief 判断报文是否为告知网络连接状态
 *
 * @param pDataIn                      - 待解析的数据
 * @param pConnectStatusOut            - 连接状态
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307DetermineMessageIsInformingNetworkConnectionState(const void *pDataIn, uint8_t *pConnectStatusOut);

/**
 * @brief 判断报文是否为告知网络断开状态
 *
 * @param pDataIn                      - 待解析的数据
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307DetermineMessageIsInformingNetworkDisconnectionState(const void *pDataIn);

/**
 * @brief 解析URC事件-接收信息报文
 *
 * @param pDataIn                      - 待解析的数据
 * @param pDataOut                     - 服务器推送的数据
 * @param pSizeOut                     - 服务器推送数据长度
 * @return Ml307MessageParsingResult_t - 解析状态
 */
extern Ml307MessageParsingResult_t Ml307ParsingPublishMessage(const void *pDataIn, uint8_t *pDataOut, uint16_t *pSizeOut);

#endif
#endif
